﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Office.Core;
using Microsoft.Office.Interop.Excel;
using WpfApplication12.Modeli;
using System.Data.SqlClient;
using System.Configuration;

namespace WpfApplication12
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : System.Windows.Window
    {
        private List<Obcina> obcine = new List<Obcina>();

        public MainWindow()
        {
            InitializeComponent();
        }

        private void GumbBeri_Click(object sender, RoutedEventArgs e)
        {
            // PREVERIMO ALI JE MS EXCEL SPLOH NAMESCEN
            var xapp = new Microsoft.Office.Interop.Excel.Application();
            if (xapp == null)
            {
                Console.WriteLine("Excel is not installed or could not be initialized");
                return;
            }

            // USTVARIMO DIALOG ZA ISKANJE EXCEL DATOTEK
            Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
            dlg.DefaultExt = ".xls";
            dlg.Filter = "Excel files (*.xls;*.xlsx)|*.xls;*.xlsx";

            Nullable<bool> result = dlg.ShowDialog();
            if (result == true)
            {
                string filename = dlg.FileName;

                Workbook workbook = null;
                try
                {
                    // POSKUSIMO ODPRETI EXCEL DOKUMENT
                    // CE NE GRE, JE NEKAJ NAROBE IN SMO ZAKLJUCILI
                    workbook = xapp.Workbooks.Open(filename);
                    if (workbook == null)
                    {
                        Console.WriteLine("Workbook could not be opened");
                        return;
                    }
                    
                    // SEZNAM OBCIN KASNEJE UPORABIMO ZA VSTAVLJANJE V BAZO
                    // ZATO GA TU NAJPREJ POCISTIMO
                    // DA NE PRIDE NO NAPAKE ZARADI PODVAJANJA VNOSOV V BAZI
                    obcine.Clear();

                    // IZ EXCEL DATOTEKE IZBEREMO SAMO PRVI LIST
                    // OSTALI NAS V TEM PRIMERU NE ZANIMAJO
                    Worksheet ws = workbook.Worksheets.get_Item(1);
                    Range range = ws.UsedRange;

                    // NE ZANIMAJO NAS PRVE 3 VRSTICE Z IMENI STOLPCEV
                    // IN VRSTICA S PODATKI ZA CELOTNO SLOVENIJO
                    for (int i = 4; i <= range.Rows.Count; i++)
                    {
                        try
                        {
                            // PREBEREMO POSAMEZNE VREDNOSTI ZA OBCINO
                            // PAZIMO LE, DA ZACNEMO STETI Z 1 IN NE Z 0
                            var tmp = new Obcina();
                            tmp.RegijaID = int.Parse((range.Cells[i, 1] as Microsoft.Office.Interop.Excel.Range).Value.ToString());
                            tmp.ObcinaID = int.Parse((range.Cells[i, 2] as Microsoft.Office.Interop.Excel.Range).Value.ToString());
                            tmp.Ime = (range.Cells[i, 3] as Microsoft.Office.Interop.Excel.Range).Value.ToString();
                            tmp.Povrsina = int.Parse((range.Cells[i, 4] as Microsoft.Office.Interop.Excel.Range).Value.ToString());
                            tmp.StPrebivalcev = int.Parse((range.Cells[i, 5] as Microsoft.Office.Interop.Excel.Range).Value.ToString());
                            tmp.StMoskih = int.Parse((range.Cells[i, 6] as Microsoft.Office.Interop.Excel.Range).Value.ToString());
                            tmp.StZensk = int.Parse((range.Cells[i, 7] as Microsoft.Office.Interop.Excel.Range).Value.ToString());
                            tmp.NaravniPrirastek = int.Parse((range.Cells[i, 8] as Microsoft.Office.Interop.Excel.Range).Value.ToString());
                            tmp.SkupniPrirastek = int.Parse((range.Cells[i, 9] as Microsoft.Office.Interop.Excel.Range).Value.ToString());
                            tmp.StAvtomobilov = int.Parse((range.Cells[i, 24] as Microsoft.Office.Interop.Excel.Range).Value.ToString());

                            // OBCINO S PRIDOBLJENIMI PODATKI DODAMO V SEZNAM
                            obcine.Add(tmp);
                        }
                        catch (Exception exc)
                        {
                            Console.WriteLine("Neveljavna obcina ali manjkajo podatki");
                        }
                    }

                    // POVSEM INFORMATIVNO
                    // PREVERIMO KOLIKO OBCIN SMO V EXCELU NASLI IN JIH DODALI V SVOJ SEZNAM
                    MessageBox.Show(obcine.Count + "");
                }
                catch (Exception ex)
                {
                    // ULOVIMO MOREBITNE IZJEME
                    Console.WriteLine(ex.Message);
                }
                finally
                {
                    // ZAPREMO EXCEL DATOTEKO
                    if (workbook != null)
                    {
                        workbook.Close();
                    }
                }
            }
        }

        private void GumbTest_Click(object sender, RoutedEventArgs e)
        {
            // TESTNO POVPRASEVANJE
            // PREVIMO VELJAVNOST CONNECTIONSTRING-A
            // IZ TABELE REGIJ PREBEREMO VSE VRSTICE
            // VSAKO REGIJO JAVIMO V OBLIKI POPOP-A

            try
            {
                using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["StatistikaConnectionString"].ConnectionString))
                {
                    using (SqlCommand com = new SqlCommand("SELECT * FROM Region", con))
                    {
                        con.Open();
                        using (SqlDataReader sdr = com.ExecuteReader())
                        {
                            while (sdr.Read())
                            {
                                // DO VREDNOSTI V TABELI V BAZI LAHKO DOSTOPAMO PREKO IMENA IN INDEXA
                                MessageBox.Show(sdr["id"] + " - " + sdr[1]);
                            }
                        }
                    }
                    if (con.State != System.Data.ConnectionState.Closed)
                        con.Close();
                }
            }
            catch (Exception exc) { }
        }

        private void GumbVnesiPopulacijo_Click(object sender, RoutedEventArgs e)
        {
            // METODA NAMENJENA VNOSTU STATISTICNIH PODATKOV O POPULACIJI V BAZO

            // PRIPRAVIMO SI QUERY ZA VNOS; KJER IZBEREMO, KATERE STOLPCE BOMO VNASALI V KAKSNEM ZAPOREDJU
            StringBuilder sb = new StringBuilder("INSERT INTO Statistic_population (id, fk_regionID, fk_municipalityID, area, population, mens, womens, natural_annual_growth, total_annual_growth) VALUES ");
            
            // SPREHODIMO SE SKOZI PREJ USTVARJEN SEZNAM OBCIN IN PO VRSTI DOPOLNIMO QUERY S PRAVILNIMI PODATKI OBCINE
            string[] data = new string[obcine.Count];
            for (int i = 0; i < obcine.Count; i++)
            {
                Obcina o = obcine[i];
                if (o != null)
                {
                    // V BAZI JE NASTAVLJENO, DA MORAMO SAMI VNESTI ID OBCINE, ZATO GA VKLJUCIMO V QUERY
                    // OBICAJNO SE TO NASTAVI KOT IDENTITY IN MI NE SKRBIMO ZANJ...
                    data[i] = string.Format("({0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8})", (i + 1), o.RegijaID, o.ObcinaID, o.Povrsina, o.StPrebivalcev, o.StMoskih, o.StZensk, o.NaravniPrirastek, o.SkupniPrirastek);
                }
            }

            // PODATKE ZA POSAMEZNO OBCINO LOCIMO Z VEJICO
            // JOIN METODA NAM DELO OLAJSA, SAJ SE IZOGNEMO ODVECI VEJICI NA KONCU QUERY-a
            sb.Append(String.Join(", ", data));
            var query = sb.ToString();

            // V PRIMERU DA SMO POZABILI PREBRATI DATOTEKO
            // ALI JE BRANJE VRNILO SKRITO NAPAKO
            // SE TUKAJ USTAVIMO
            if (obcine.Count < 1)
            {
                MessageBox.Show("Manjkajo podatki za vnos.\nNajprej preberi pravo datoteko.");
                return;
            }


            // DEJANSKO VNASANJE PODATKOV V BAZO
            try
            {
                using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["StatistikaConnectionString"].ConnectionString))
                {
                    using (SqlCommand com = new SqlCommand(query, con))
                    {
                        con.Open();
                        com.ExecuteNonQuery();
                    }
                    if (con.State != System.Data.ConnectionState.Closed)
                        con.Close();
                }
            }
            catch (Exception exc) { }

            // SLUZI LE INFORMATIVNEMU NAMENU
            // DA VEMO, DA SE JE METODA ZAKLJUCILA
            MessageBox.Show("Vnos podatkov zaključen");
        }

        private void GumbVnesiAvtomobili_Click(object sender, RoutedEventArgs e)
        {
            // SKORAJ POVSEM ENAKO KOT VNOSU STATISTICNIH PODATKOV O PREBIVALSTCU
            // QUERY SE RAZLIKUJE V TABELI IN NJEJ PRIPADAJOCIH STOLPCIH

            StringBuilder sb = new StringBuilder("INSERT INTO Statistic_cars (fk_regionID, fk_municipalityID, cars) VALUES ");

            string[] data = new string[obcine.Count];
            for (int i = 0; i < obcine.Count; i++)
            {
                Obcina o = obcine[i];
                if (o != null)
                {
                    data[i] = string.Format("({0}, {1}, {2})", o.RegijaID, o.ObcinaID, o.StAvtomobilov);
                }
            }

            sb.Append(String.Join(", ", data));
            var query = sb.ToString();

            if (obcine.Count < 1)
            {
                MessageBox.Show("Manjkajo podatki za vnos.\nNajprej preberi pravo datoteko.");
                return;
            }

            try
            {
                using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["StatistikaConnectionString"].ConnectionString))
                {
                    using (SqlCommand com = new SqlCommand(query, con))
                    {
                        con.Open();
                        com.ExecuteNonQuery();
                    }
                    if (con.State != System.Data.ConnectionState.Closed)
                        con.Close();
                }
            }
            catch (Exception exc) { }

            MessageBox.Show("Vnos podatkov zaključen");
        }
    }
}
